home *** CD-ROM | disk | FTP | other *** search
- #include "watching.h"
- #include "shared.h"
-
- /* Local Prototypes ********************************/
- ComponentResult HandleConferenceEvent ( MTConferenceEventPtr confEvent );
- ComponentResult DoMemberJoining( MTConferenceEventPtr confEvent );
- ComponentResult DoConfReady( MTConferenceEventPtr confEvent );
- ComponentResult DoMemberReady( MTConferenceEventPtr confEvent );
- ComponentResult DoMemberTerminated( MTConferenceEventPtr confEvent );
- ComponentResult DoPhoneRinging( MTConferenceEventPtr confEvent );
- ComponentResult DisposeConference( ConferenceRecord* conf );
- ComponentResult DisposeMemberRecord( MemberRecord* member );
- ComponentResult NewConference( ConferenceRecord** conf );
- ComponentResult NewMember( MemberRecord** member );
- void AddMember( ConferenceRecord* conf, MemberRecord* member );
- void RemoveMember( ConferenceRecord* conf, MemberRecord* member );
- MemberRecord* FindMember( ConferenceRecord* conf, MTConferenceMember who );
- MemberRecord* FindMemberWindow( ConferenceRecord* conf, WindowPtr wind );
- pascal Boolean MyControllerActionFilter(MTControllerComponent mtc, MTControllerActionType action, void *params, long refCon);
-
-
- /* globals *****************************************/
- ConferenceRecord* gConference; /* the conference */
-
- MTControllerActionFilterUPP actionFilterUPP = NewMTControllerActionFilterProc(MyControllerActionFilter);
-
- /***************************************************
- CreateWatchConference
- ****************************************************/
- ComponentResult CreateWatchConference( Str63 userName ) {
-
- ComponentResult err;
- MTCString63 cUserName;
-
- /* convert the to the funky MTCString format */
- PToCString( userName, cUserName );
-
- /* creates a conference record */
- err = NewConference( &gConference );
- if (err == noErr) {
-
- gConference->confComponent = OpenDefaultComponent(kMTConferenceType, kMTMovieTalkSubType );
-
- if (gConference->confComponent)
- {
- /* tell the conference component that we only wish to receive media, not send */
- err = MTConferenceSetMode(gConference->confComponent, mtReceiveMediaModeMask);
-
- /* tell the conference component to prepare to use AppleTalk. */
- /* the funky string tells the conference component to:
- mtlk = use the MovieTalk transport component
- atlk = use the AppleTalk network component
- NoIncomingCalls = the AppleTalk specific NBP type that is used for listening,
- i.e. there will be no incoming calls
- */
- if (err == noErr)
- err = MTConferenceListen(gConference->confComponent, cUserName, cUserName, (MTCString)"mtlkatlk\tNoIncomingCalls\x0D");
- }
- else
- err = couldntGetRequiredComponent;
- }
- return err;
- }
-
- /***************************************************
- CallMember
- ****************************************************/
- ComponentResult CallMember( MTName* name,
- WindowPtr wind,
- Rect* box,
- Boolean resize,
- MemberRecord** member ) {
-
- MemberRecord* mr;
- ComponentResult err;
-
- /* create a new member record */
- err = NewMember( &mr );
-
- if (err == noErr) {
-
- mr->member = MTConferenceCall(gConference->confComponent,
- (MTCString)"Watcher", name);
-
- mr->box = *box;
-
- mr->window = wind;
-
- mr->resize = resize;
-
- if (member)
- *member = mr;
-
- AddMember( gConference, mr );
- }
-
- return err;
- }
-
- /***************************************************
- SaveWatch
- ****************************************************/
- void SaveWatch( void ) {
-
- }
-
- /***************************************************
- CloseWatch
- ****************************************************/
- ComponentResult CloseWatch( WindowPtr window ) {
-
- ComponentResult err = noErr;
- MTConferenceToken theConference;
- MemberRecord* theMember;
-
- theMember = FindMemberWindow( gConference, window );
-
- if (theMember == nil)
- err = paramErr;
-
- if (err == noErr)
- {
- theConference = MTConferenceGetMemberConference(gConference->confComponent, theMember->member);
- err = MTConferenceTerminate(gConference->confComponent, theConference);
- }
- return err;
- }
-
- /***************************************************
- GetWatchInfo
- ****************************************************/
- void GetWatchInfo( void ) {
-
- }
-
- /***************************************************
- DoCopy
- ****************************************************/
- void DoCopy( void ) {
-
- }
-
- /***************************************************
- IsWatchWindow
- ****************************************************/
- Boolean IsWatchWindow( WindowPtr window ) {
- Boolean isWatch = false;
- MemberRecord* mr = gConference->memberHead;
-
- while (mr != nil)
- {
- if (mr->window == window)
- {
- isWatch = true;
- break;
- }
- mr = mr->next;
- }
-
- return isWatch;
- }
-
- /***************************************************
- HandleConferenceEvent
- ****************************************************/
- ComponentResult HandleConferenceEvent ( MTConferenceEventPtr confEvent ){
-
- ComponentResult err = noErr;
-
- /* like a user event handler, we switch on the different conference events */
- switch(confEvent->what){
- case mtConferenceReadyEvent:
- err = DoConfReady(confEvent);
- break;
-
- case mtMemberReadyEvent:
- err = DoMemberReady(confEvent);
- break;
-
- case mtMemberTerminatedEvent:
- err = DoMemberTerminated(confEvent);
- break;
-
- case mtMemberJoiningEvent:
- err = DoMemberJoining(confEvent);
- break;
-
- case mtPhoneRingingEvent:
- err = DoPhoneRinging(confEvent);
- break;
-
- case mtRefusedEvent:
- err = confEvent->err;
- break;
-
- case mtFailedEvent:
- err = confEvent->err;
- break;
-
- default:
- /* ignore all others */
- break;
- }
-
- if(confEvent->surprise)
- DisposeHandle(confEvent->surprise);
-
- return err;
- }
-
- /***************************************************
- DoMemberJoining
- ****************************************************/
- ComponentResult DoMemberJoining( MTConferenceEventPtr confEvent ){
- MemberRecord* currMember;
- ComponentResult err = noErr;
-
- err = NewMember( &currMember);
- if (err != nil) {
- currMember->member = confEvent->who;
- AddMember( gConference, currMember );
- }
- return err;
- }
-
- /***************************************************
- DoConfReady
- ****************************************************/
- ComponentResult DoConfReady( MTConferenceEventPtr confEvent ){
-
- return MTConferenceActivateConference(gConference->confComponent, confEvent->who, 0);
-
- }
-
- /***************************************************
- DoMemberReady
- ****************************************************/
- ComponentResult DoMemberReady( MTConferenceEventPtr confEvent ){
-
- ComponentResult err = noErr;
- MemberRecord* currMember;
- Rect box = { 100, 100, 220, 260 };
- Point where = { 0, 0 };
- Str255 windowName;
- Boolean aFalse = false;
-
- if (confEvent->bonus & mtReceiveMediaModeMask) {
-
- currMember = FindMember(gConference, confEvent->who);
-
- if (currMember == nil)
- return noErr;
-
- currMember->controller = OpenDefaultComponent( kMTControllerType, kMTMovieTalkSubType );
-
- if (currMember->controller == 0)
- err = couldntGetRequiredComponent;
-
- currMember->director = OpenDefaultComponent(kMTSinkStreamDirectorType, kMTPlayerType);
-
- if (currMember->director == 0)
- err = couldntGetRequiredComponent;
-
- if (err == noErr)
- err = MTControllerSetActionFilter(currMember->controller, actionFilterUPP, (long)currMember);
-
- if (err == noErr)
- err = MTControllerNewAttachedController(currMember->controller, currMember->director,
- currMember->window, where);
- if (err == noErr)
- err = MTControllerDoAction( currMember->controller, mtControllerActionSetShowSnapshot, &aFalse );
-
- if (err == noErr)
- err = MTConferenceActivateMember(gConference->confComponent, confEvent->who, currMember->controller);
-
- GetMemberName( currMember, windowName );
- SetWTitle(currMember->window, windowName );
-
- }
-
- return err;
- }
-
- /***************************************************
- DoMemberTerminated
- ****************************************************/
- ComponentResult DoMemberTerminated( MTConferenceEventPtr confEvent ){
- MemberRecord* member;
- ComponentResult err;
-
- member = FindMember(gConference, confEvent->who);
-
- if(member == nil)
- return noErr;
-
- RemoveMember( gConference, member );
-
- if(member->controller)
- CloseComponent( member->controller);
-
- if (member->director)
- CloseComponent( member->director);
-
- if (member->window)
- CloseWindow( member->window);
-
- err = DisposeMemberRecord( member );
-
- return err;
- }
-
- /***************************************************
- DoPhoneRinging
- ****************************************************/
- ComponentResult DoPhoneRinging( MTConferenceEventPtr confEvent ){
-
- ComponentResult err = noErr;
- MTConferenceEventPtr unused = confEvent;
-
- return err;
- }
-
- /***************************************************
- TearDown
- ****************************************************/
- void TearDownWatch( void ) {
- /* close the conference component if there is one */
- if (gConference->confComponent)
- CloseComponent(gConference->confComponent);
- }
-
- /***************************************************
- IsConferenceEvent
- ****************************************************/
- Boolean IsConferenceEvent( EventRecord* theEvent ) {
-
- ComponentResult err = noErr;
- Boolean handled = false;
- MemberRecord* member = gConference->memberHead;
-
- while ((member != nil) && (handled != true))
- {
- handled = MTControllerIsControllerEvent (member->controller, theEvent );
- member = member->next;
- }
-
- return handled;
- }
-
- /***************************************************
- CheckConferenceEvents
- ****************************************************/
- ComponentResult CheckConferenceEvents( void ) {
-
- MTConferenceEvent confEvent;
- ComponentResult err = noErr;
-
- if( MTConferenceGetNextEvent( gConference->confComponent, &confEvent ) )
- err = HandleConferenceEvent(&confEvent);
-
- return err;
- }
-
- /***************************************************
- NewMember
- ****************************************************/
- ComponentResult NewMember( MemberRecord** member ) {
-
- *member = (MemberRecord*)NewPtrClear( sizeof( MemberRecord));
-
- return MemError();
- }
-
- /***************************************************
- NewConference
- ****************************************************/
- ComponentResult NewConference( ConferenceRecord** conf ) {
-
- *conf = (ConferenceRecord*)NewPtrClear( sizeof( ConferenceRecord) );
-
- return MemError();
- }
-
- /***************************************************
- DisposeMemberRecord
- ****************************************************/
- ComponentResult DisposeMemberRecord( MemberRecord* member ) {
-
- DisposePtr( (Ptr)member );
-
- return MemError();
- }
-
- /***************************************************
- DisposeConference
- ****************************************************/
- ComponentResult DisposeConference( ConferenceRecord* conf ) {
-
- DisposePtr( (Ptr)conf );
-
- return MemError();
- }
-
- /***************************************************
- AddMember
- ****************************************************/
- void AddMember( ConferenceRecord* conf, MemberRecord* member ) {
-
- MemberRecord* oldHead;
-
- oldHead = conf->memberHead;
-
- conf->memberHead = member;
-
- member->next = oldHead;
-
- }
-
- /***************************************************
- RemoveMember
- ****************************************************/
- void RemoveMember( ConferenceRecord* conf, MemberRecord* member ) {
-
- MemberRecord** prevHead = &conf->memberHead;
- MemberRecord* oldHead = conf->memberHead;
-
- while ( oldHead != nil ) {
- if ( oldHead == member )
- {
- *prevHead = oldHead->next;
- break;
- }
- prevHead = &oldHead->next;
- oldHead = oldHead->next;
- }
- }
-
- /***************************************************
- FindMember
- ****************************************************/
- MemberRecord* FindMember( ConferenceRecord* conf, MTConferenceMember who ) {
-
- MemberRecord* foundMember = nil;
- MemberRecord* currMember = conf->memberHead;
-
- while (currMember != nil) {
-
- if (currMember->member == who)
- {
- foundMember = currMember;
- break;
- }
-
- currMember = currMember->next;
- }
-
- return foundMember;
- }
-
- /***************************************************
- FindMemberWindow
- ****************************************************/
- MemberRecord* FindMemberWindow( ConferenceRecord* conf, WindowPtr wind ) {
-
- MemberRecord* foundMember = nil;
- MemberRecord* currMember = conf->memberHead;
-
- while (currMember != nil) {
-
- if (currMember->window == wind)
- {
- foundMember = currMember;
- break;
- }
-
- currMember = currMember->next;
- }
-
- return foundMember;
- }
-
- /***************************************************
- GetMemberName
- ****************************************************/
- ComponentResult GetMemberName( MemberRecord* mr, Str255 name )
- {
- ComponentResult err = noErr;
- MTCString confName;
- int nameLen;
-
- confName = MTConferenceGetMemberName( gConference->confComponent, mr->member);
-
- if (name != NULL)
- {
- /* poor man's ctop string copy */
- for ( nameLen = 0; name[nameLen] != 0; nameLen++)
- {
- name[nameLen+1] = confName[nameLen];
- if (nameLen > 254)
- break;
- }
- name[0] = nameLen;
- }
- else
- err = paramErr;
-
- return err;
- }
-
- /***************************************************
- MyControllerActionFilter
- ****************************************************/
- pascal Boolean MyControllerActionFilter(MTControllerComponent mtc,
- MTControllerActionType action,
- void* params, long refCon ) {
- void* unused1 = params;
- long unused2 = refCon;
- Boolean handled = false;
- WindowPtr controllerWindow = (WindowPtr)MTControllerGetControllerPort(mtc);
- Rect box;
-
- Boolean aTrue = true;
-
- switch (action)
- {
- case mtControllerActionControllerSizeChanged:
- /* find out how big the controller is */
- MTControllerGetControllerBoundsRect(mtc, &box);
- /* resize the window accordingly */
- SizeWindow ( controllerWindow, box.right, box.bottom, true);
- /* make the window visible if it wasn't (i.e. it was just created) */
- ShowWindow( controllerWindow );
-
- /* controller bug fix: change controller size to sync up to transmitted size */
- {
- Boolean remoteChange = (*(Boolean*)params);
- if (remoteChange)
- {
- MTControllerSetControllerBoundsRect(mtc, &box);
- }
- }
- break;
-
- case mtControllerActionStreamsChanged:
- MTControllerDoAction(mtc, mtControllerActionPlay, &aTrue);
- break;
-
- default:
- break;
- }
-
- return handled;
- }